package com.taologs.search;

import org.ansj.lucene6.AnsjAnalyzer;
import org.apache.lucene.analysis.Analyzer;
import org.apache.lucene.document.Document;
import org.apache.lucene.index.DirectoryReader;
import org.apache.lucene.index.IndexReader;
import org.apache.lucene.queryparser.classic.MultiFieldQueryParser;
import org.apache.lucene.queryparser.classic.QueryParser;
import org.apache.lucene.search.IndexSearcher;
import org.apache.lucene.search.Query;
import org.apache.lucene.search.ScoreDoc;
import org.apache.lucene.search.TopDocs;
import org.apache.lucene.store.Directory;
import org.apache.lucene.store.FSDirectory;

import java.io.File;

public class Searcher {
 
     /**
      * 查询方法 
      * @param indexDir 索引文件的目录
      * @param q 需要查询的某个参数(查询content字段)
      * @throws Exception
      */
     public static void search(String indexDir,String q)throws Exception{
         Directory dir= FSDirectory.open(new File(indexDir).toPath()); // 取索引存放的位置信息
         IndexReader reader= DirectoryReader.open(dir); // 取一个完整目录下的索引
         IndexSearcher indexSearcher=new IndexSearcher(reader); // reader放进索引查询器
         Analyzer analyzer=new AnsjAnalyzer(); // 标准分词器
         /**
          * 只能按照一个字段去查询,需要两个参数。一个是查询的域，一个是分词器
          * new QueryParser
          *
          */
         QueryParser parser=new MultiFieldQueryParser(new String[]{"contents","fileName","fullPath"}, analyzer); // 例化查询解析器，指定需要查询的字段和分词器
         Query query=parser.parse(q); // 字符串q转换成query对象用于查询解析
         long start=System.currentTimeMillis(); // 执行查询操作前计时
         TopDocs topDocs=indexSearcher.search(query, 10); // 询前10条数据，返回最前面的文档
         long end=System.currentTimeMillis(); // 查询结束计时
         System.out.println("匹配 "+q+" ，总共花费"+(end-start)+"毫秒"+"查询到"+topDocs.totalHits+"个记录");
         for(ScoreDoc scoreDoc:topDocs.scoreDocs){ // 遍历查询结果的集合
             Document doc=indexSearcher.doc(scoreDoc.doc); // scoreDoc.doc返回int编号,类似主键,IndexSearcher通过它获取文档(行记录)
             System.out.println(doc.get("fullPath")+"\t"+"当前对象在索引库中的得分： "+scoreDoc.score); // 以通过doc获取它的任意字段内容,这里获取"完整路径"字段的内容
         }
         reader.close();
     }
     
     // 编写测试方法
    //http://www.cnblogs.com/ShawnYuki/p/6417641.html
     public static void main(String[] args) {
         String indexDir="D:\\lucene\\index";
         String q="saveblog";
         try {
             search(indexDir,q);
         } catch (Exception e) {
             // TODO Auto-generated catch block
             e.printStackTrace();
         }
     }
 }